package com.sheng.leetcode.year2022.month06.day29;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @author liusheng
 * @date 2022/06/29
 *
 * 535. TinyURL 的加密与解密
 *
 * TinyURL 是一种 URL 简化服务， 比如：当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时，
 * 它将返回一个简化的URL http://tinyurl.com/4e9iAk 。请你设计一个类来加密与解密 TinyURL 。
 * 加密和解密算法如何设计和运作是没有限制的，你只需要保证一个 URL 可以被加密成一个 TinyURL ，
 * 并且这个 TinyURL 可以用解密方法恢复成原本的 URL 。
 *
 * 实现 Solution 类：
 * Solution() 初始化 TinyURL 系统对象。
 * String encode(String longUrl) 返回 longUrl 对应的 TinyURL 。
 * String decode(String shortUrl) 返回 shortUrl 原本的 URL 。题目数据保证给定的 shortUrl 是由同一个系统对象加密的。
 *
 * 示例：
 * 输入：url = "https://leetcode.com/problems/design-tinyurl"
 * 输出："https://leetcode.com/problems/design-tinyurl"
 *
 * 解释：
 * Solution obj = new Solution();
 * string tiny = obj.encode(url); // 返回加密后得到的 TinyURL 。
 * string ans = obj.decode(tiny); // 返回解密后得到的原本的 URL 。
 *
 * 提示：
 * 1 <= url.length <= 104
 * 题目数据保证 url 是一个有效的 URL
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/encode-and-decode-tinyurl
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode0535 {

    @Test
    public void test01(){
        String url = "https://leetcode.com/problems/design-tinyurl";
        Codec obj = new Codec();
        String tiny = obj.encode(url);
        System.out.println("加密后的url：" + tiny);
        System.out.println("解密后的url：" + obj.decode(tiny));
    }

}
class Codec {

    //TinyURL 的加密与解密：将长字符串转换成一个固定值，可以是集合索引，也可以是字符串对应的hashCode等
    Map<Integer, String> map = new HashMap<>();
    int index = 0;
    // Encodes a URL to a shortened URL.
    public String encode(String longUrl) {
//        map.put(longUrl.hashCode(), longUrl);
//        return "http://tinyurl.com/" + longUrl.hashCode();
        map.put(index, longUrl);
        return "http://tinyurl.com/" + index++;
    }

    // Decodes a shortened URL to its original URL.
    public String decode(String shortUrl) {
//        int i = Integer.parseInt(shortUrl.replace("http://tinyurl.com/", ""));
//        return map.get(i);
        return map.get(shortUrl.charAt(shortUrl.length() - 1) - '0');
    }
}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.decode(codec.encode(url));
